#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File   : middlewares.py
# @Email  : xuexia_xu@feidee.com
# @Time   : 2024/5/9 17:35
# @Desc   : 自定义中间件，实现用户登录验证的功能

"""
middlewares.py
"""
from django.http import JsonResponse
import logging
from django.shortcuts import redirect, render

logger = logging.getLogger('solomon_info')

# 需要登录才能访问的资源路径
LOGIN_REQUIRED_URLS = {'/praise/', '/criticize/', '/excel/', '/teachers_data/'}


def check_login_middleware(get_resp):
    def wrapper(request, *args, **kwargs):
        print("check_login_middleware", {
            'path': request.path,
            'method': request.method,
            # 包含了所有以?xxx=xxx的方式上传上来的参数
            'get_data': request.GET,
            # 包含了所有以POST方式上传上来的参数
            'post_data': request.POST,
            # 包含了所有上传的文件
            'file': request.FILES,
            # 请求携带的cookie值
            'cookie': request.COOKIES,
            # 请求携带的session值
            'session': request.session,
            # 当前系统用户
            'user': request.user.username,
            # WSGIRequest对象常用方法
            # 是否是采用https协议
            'is_secure': request.is_secure(),
            # 'is_ajax': request.is_ajax(),
            'host': request.get_host(),
            'full_path': request.get_full_path(),
            'request_body': request.session,
            'headers': request.META
            # 获取请求的完整url
            # 'raw_uri': request.get_raw_uri()
        })

        # 请求的资源路径在上面的集合中
        if request.path in LOGIN_REQUIRED_URLS:
            authorization = request.META.get('HTTP_AUTHORIZATION', '')
            print("authorization:", authorization)
            # 会话中包含userid则视为已经登录
            if not authorization:
                print("authorization 不存在")
                # 判断是不是Ajax请求
                if request.headers.get('x-requested-with') == 'XMLHttpRequest':
                    # Ajax请求返回JSON数据提示用户登录
                    return JsonResponse({'code': 10003, 'hint': '请先登录'})
                else:
                    return JsonResponse({'code': 10003, 'hint': '请先登录'})
                    # backurl = request.get_full_path()
                    # # 非Ajax请求直接重定向到登录页
                    # return redirect(f'/login/?backurl={backurl}')
            else:
                return get_resp(request, *args, **kwargs)
        return get_resp(request, *args, **kwargs)

    return wrapper
